// public private 和 protected
// public修饰的属性或者方法是公有的，可以在任何地方被访问到，默认所有属性和方法都是public的
// private修饰的属性或方法是私有的，不能在声明它的类的外部访问
// protected修饰的属性或者方法是受保护的，他和private类似，区别是他在子类中也是允许被访问的。

class Animal {
    public name;
    public constructor(name) {
        this.name = name;
    }
}
let a = new Animal('zs');
console.log(a.name);
a.name = 'tom';
console.log(a.name);

class Person {
    private name;
    public constructor(name) {
        this.name = name;
    }
}
let b = new Person('zs');
// console.log(b.name); // 属性“name”为私有属性，只能在类“Animal”中访问。
// b.name = 'Tom'; // 属性“name”为私有属性，只能在类“Animal”中访问。
// console.log(b.name); // 属性“name”为私有属性，只能在类“Animal”中访问。

// 使用private修饰的属性或方法，在子类中也是不允许访问的：
// class P1 extends Person {
//   constructor(name) {
//     super(name)
//     console.log(this.name); // error
//   }
// }

// 而如果是用protected修饰，则允许在子类中访问：
class Animal1 {
    protected name;
    public constructor(name) {
        this.name = name;
    }
}
class Cat extends Animal1 {
    constructor(name) {
        super(name);
        console.log(this.name);
    }
}

// 如果readonly和其他访问修饰符同时存在的话，需要写在其后面。

// 类的类型
// 给类加上 TypeScript的类型很简单，与接口类似：
class Animal2 {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    sayHi(): string {
        return `My name is ${this.name}`;
    }
}

let e: Animal2 = new Animal2('Jack');
console.log(e.sayHi());

// 在 TypeScript中可以 接口继承类
